🎖️GitЯра🎖️
src/Mesh.cpp 890a2e2cffa98dea3ca88db3c3aba72ef23ff3f7 (890a2e2c) Text, 27.78 KB
Tff7b72#Tff7b72include T8b949e"Mesh.h"
T8b949e//#include <Arduino.h>
Tff7b72namespace T7ee787mesh Tb4b4b4{
Tffa657void Td2a8ffMesh::beginTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3DispatcherTff7b72:Tff7b72:Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffMesh::loopTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3DispatcherTff7b72:Tff7b72:Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657bool Td2a8ffMesh::allowPacketForwardTb4b4b4(Tff7b72const Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4) Tb4b4b4{
Tff7b72return Tffa657falseTb4b4b4; T8b949e// by default, Transport NOT enabled
Tb4b4b4}
Tffa657uint32_t Td2a8ffMesh::getRetransmitDelayTb4b4b4(Tff7b72const Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4) Tb4b4b4{
Tffa657uint32_t Te6edf3t Tff7b72= Tb4b4b4(Te6edf3_radioTff7b72-Tff7b72>Te6edf3getEstAirtimeForTb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3getRawLengthTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72* T79c0ff52 Tff7b72/ T79c0ff50Tb4b4b4) Tff7b72/ T79c0ff2Tb4b4b4;
Tff7b72return Te6edf3_rngTff7b72-Tff7b72>Te6edf3nextIntTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff5Tb4b4b4)Tff7b72*Te6edf3tTb4b4b4;
Tb4b4b4}
Tffa657uint32_t Td2a8ffMesh::getDirectRetransmitDelayTb4b4b4(Tff7b72const Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4) Tb4b4b4{
Tff7b72return T79c0ff0Tb4b4b4; T8b949e// by default, no delay
Tb4b4b4}
Tffa657uint8_t Td2a8ffMesh::getExtraAckTransmitCountTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}
Tffa657uint32_t Td2a8ffMesh::getCADFailRetryDelayTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return Te6edf3_rngTff7b72-Tff7b72>Te6edf3nextIntTb4b4b4(T79c0ff1Tb4b4b4, T79c0ff4Tb4b4b4)Tff7b72*T79c0ff120Tb4b4b4;
Tb4b4b4}
Tffa657int Td2a8ffMesh::searchPeersByHashTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3hashTb4b4b4) Tb4b4b4{
Tff7b72return T79c0ff0Tb4b4b4; T8b949e// not found
Tb4b4b4}
Tffa657int Td2a8ffMesh::searchChannelsByHashTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3hashTb4b4b4, Te6edf3GroupChannel Te6edf3channelsTb4b4b4[Tb4b4b4]Tb4b4b4, Tffa657int Te6edf3max_matchesTb4b4b4) Tb4b4b4{
Tff7b72return T79c0ff0Tb4b4b4; T8b949e// not found
Tb4b4b4}
Te6edf3DispatcherAction Td2a8ffMesh::onRecvPacketTb4b4b4(Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3isRouteDirectTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3pktTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_TRACETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3path_len Tff7b72< Te6edf3MAX_PATH_SIZETb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4;
Tffa657uint32_t Te6edf3trace_tagTb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3trace_tagTb4b4b4, Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4; Te6edf3i Tff7b72+Tff7b72= T79c0ff4Tb4b4b4;
Tffa657uint32_t Te6edf3auth_codeTb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3auth_codeTb4b4b4, Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4; Te6edf3i Tff7b72+Tff7b72= T79c0ff4Tb4b4b4;
Tffa657uint8_t Te6edf3flags Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTff7b72+Tff7b72+Tb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3path_sz Tff7b72= Te6edf3flags Tff7b72& T79c0ff0x03Tb4b4b4; T8b949e// NEW v1.11+: lower 2 bits is path hash size
Tffa657uint8_t Te6edf3len Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_len Tff7b72- Te6edf3iTb4b4b4;
T8b949e// path_len*entry_size can exceed 255 (path_len up to 63, entry_size up to 8);
T8b949e// a uint8_t offset would wrap and steer the isHashMatch() read to the wrong place.
Tffa657uint16_t Te6edf3offset Tff7b72= Tb4b4b4(Tffa657uint16_tTb4b4b4)Te6edf3pktTff7b72-Tff7b72>Te6edf3path_len Tff7b72<Tff7b72< Te6edf3path_szTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3offset Tff7b72>Tff7b72= Te6edf3lenTb4b4b4) Tb4b4b4{ T8b949e// TRACE has reached end of given path
Te6edf3onTraceRecvTb4b4b4(Te6edf3pktTb4b4b4, Te6edf3trace_tagTb4b4b4, Te6edf3auth_codeTb4b4b4, Te6edf3flagsTb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3pathTb4b4b4, Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3self_idTb4b4b4.Te6edf3isHashMatchTb4b4b4(Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3i Tff7b72+ Te6edf3offsetTb4b4b4]Tb4b4b4, T79c0ff1 Tff7b72<Tff7b72< Te6edf3path_szTb4b4b4) Tff7b72&Tff7b72& Te6edf3allowPacketForwardTb4b4b4(Te6edf3pktTb4b4b4) Tff7b72&Tff7b72& Tff7b72!Te6edf3_tablesTff7b72-Tff7b72>Te6edf3wasSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
T8b949e// append SNR (Not hash!)
Te6edf3pktTff7b72-Tff7b72>Te6edf3pathTb4b4b4[Te6edf3pktTff7b72-Tff7b72>Te6edf3path_lenTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Tb4b4b4(Tffa657int8_tTb4b4b4) Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3getSNRTb4b4b4(Tb4b4b4)Tff7b72*T79c0ff4Tb4b4b4)Tb4b4b4;
Tffa657uint32_t Te6edf3d Tff7b72= Te6edf3getDirectRetransmitDelayTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3ACTION_RETRANSMIT_DELAYEDTb4b4b4(T79c0ff5Tb4b4b4, Te6edf3dTb4b4b4)Tb4b4b4; T8b949e// schedule with priority 5 (for now), maybe make configurable?
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3ACTION_RELEASETb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3isRouteDirectTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3pktTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_CONTROL Tff7b72&Tff7b72& Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72& T79c0ff0x80Tb4b4b4) Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3getPathHashCountTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3onControlDataRecvTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// just zero-hop control packets allowed (for this subset of payloads)
Tff7b72return Te6edf3ACTION_RELEASETb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3isRouteDirectTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3pktTff7b72-Tff7b72>Te6edf3getPathHashCountTb4b4b4(Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
T8b949e// check for 'early received' ACK
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_ACKTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4;
Tffa657uint32_t Te6edf3ack_crcTb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3ack_crcTb4b4b4, Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4; Te6edf3i Tff7b72+Tff7b72= T79c0ff4Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3i Tff7b72<Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4) Tb4b4b4{
Te6edf3onAckRecvTb4b4b4(Te6edf3pktTb4b4b4, Te6edf3ack_crcTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3self_idTb4b4b4.Te6edf3isHashMatchTb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3pathTb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3getPathHashSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72&Tff7b72& Te6edf3allowPacketForwardTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_MULTIPARTTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3forwardMultipartDirectTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_ACKTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_tablesTff7b72-Tff7b72>Te6edf3wasSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4) Tb4b4b4{ T8b949e// don't retransmit!
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Te6edf3removeSelfFromPathTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Te6edf3routeDirectRecvAcksTb4b4b4(Te6edf3pktTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3ACTION_RELEASETb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_tablesTff7b72-Tff7b72>Te6edf3wasSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Te6edf3removeSelfFromPathTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tffa657uint32_t Te6edf3d Tff7b72= Te6edf3getDirectRetransmitDelayTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3ACTION_RETRANSMIT_DELAYEDTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3dTb4b4b4)Tb4b4b4; T8b949e// Routed traffic is HIGHEST priority
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3ACTION_RELEASETb4b4b4; T8b949e// this node is NOT the next hop (OR this packet has already been forwarded), so discard.
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3isRouteFloodTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3filterRecvFloodPacketTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4) Tff7b72return Te6edf3ACTION_RELEASETb4b4b4;
Te6edf3DispatcherAction Te6edf3action Tff7b72= Te6edf3ACTION_RELEASETb4b4b4;
Tff7b72switch Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72case Tff7b72PAYLOAD_TYPE_ACKTb4b4b4: Tb4b4b4{
Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4;
Tffa657uint32_t Te6edf3ack_crcTb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3ack_crcTb4b4b4, Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4; Te6edf3i Tff7b72+Tff7b72= T79c0ff4Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3i Tff7b72> Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::onRecvPacket(): incomplete ACK packetTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_tablesTff7b72-Tff7b72>Te6edf3wasSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Te6edf3onAckRecvTb4b4b4(Te6edf3pktTb4b4b4, Te6edf3ack_crcTb4b4b4)Tb4b4b4;
Te6edf3action Tff7b72= Te6edf3routeRecvPacketTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Tff7b72PAYLOAD_TYPE_PATHTb4b4b4:
Tff7b72case Tff7b72PAYLOAD_TYPE_REQTb4b4b4:
Tff7b72case Tff7b72PAYLOAD_TYPE_RESPONSETb4b4b4:
Tff7b72case Tff7b72PAYLOAD_TYPE_TXT_MSGTb4b4b4: Tb4b4b4{
Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4;
Tffa657uint8_t Te6edf3dest_hash Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTff7b72+Tff7b72+Tb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3src_hash Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTff7b72+Tff7b72+Tb4b4b4]Tb4b4b4;
Tffa657uint8_tTff7b72* Te6edf3macAndData Tff7b72= Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4; T8b949e// MAC + encrypted data
Tff7b72if Tb4b4b4(Te6edf3i Tff7b72+ Te6edf3CIPHER_MAC_SIZE Tff7b72>Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::onRecvPacket(): incomplete data packetTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_tablesTff7b72-Tff7b72>Te6edf3wasSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
T8b949e// NOTE: this is a 'first packet wins' impl. When receiving from multiple paths, the first to arrive wins.
T8b949e// For flood mode, the path may not be the 'best' in terms of hops.
T8b949e// FUTURE: could send back multiple paths, using createPathReturn(), and let sender choose which to use(?)
Tff7b72if Tb4b4b4(Te6edf3self_idTb4b4b4.Te6edf3isHashMatchTb4b4b4(Tff7b72&Te6edf3dest_hashTb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e// scan contacts DB, for all matching hashes of 'src_hash' (max 4 matches supported ATM)
Tffa657int Te6edf3num Tff7b72= Te6edf3searchPeersByHashTb4b4b4(Tff7b72&Te6edf3src_hashTb4b4b4)Tb4b4b4;
T8b949e// for each matching contact, try to decrypt data
Tffa657bool Te6edf3found Tff7b72= Tffa657falseTb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3j Tff7b72= T79c0ff0Tb4b4b4; Te6edf3j Tff7b72< Te6edf3numTb4b4b4; Te6edf3jTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3secretTb4b4b4[Te6edf3PUB_KEY_SIZETb4b4b4]Tb4b4b4;
Te6edf3getPeerSharedSecretTb4b4b4(Te6edf3secretTb4b4b4, Te6edf3jTb4b4b4)Tb4b4b4;
T8b949e// decrypt, checking MAC is valid
Tffa657uint8_t Te6edf3dataTb4b4b4[Te6edf3MAX_PACKET_PAYLOADTb4b4b4]Tb4b4b4;
Tffa657int Te6edf3len Tff7b72= Te6edf3UtilsTff7b72:Tff7b72:Te6edf3MACThenDecryptTb4b4b4(Te6edf3secretTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3macAndDataTb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_len Tff7b72- Te6edf3iTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3len Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{ T8b949e// success!
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_PATHTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3k Tff7b72= T79c0ff0Tb4b4b4;
Tffa657uint8_t Te6edf3path_len Tff7b72= Te6edf3dataTb4b4b4[Te6edf3kTff7b72+Tff7b72+Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3PacketTff7b72:Tff7b72:Te6edf3isValidPathLenTb4b4b4(Te6edf3path_lenTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s PAYLOAD_TYPE_PATH, bad path_len: %uTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4, Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3path_lenTb4b4b4)Tb4b4b4;
Tff7b72breakTb4b4b4; T8b949e// reject bad encoding
Tb4b4b4}
Tffa657uint8_t Te6edf3hash_size Tff7b72= Tb4b4b4(Te6edf3path_len Tff7b72>Tff7b72> T79c0ff6Tb4b4b4) Tff7b72+ T79c0ff1Tb4b4b4;
Tffa657uint8_t Te6edf3hash_count Tff7b72= Te6edf3path_len Tff7b72& T79c0ff63Tb4b4b4;
Tffa657uint8_tTff7b72* Te6edf3path Tff7b72= Tff7b72&Te6edf3dataTb4b4b4[Te6edf3kTb4b4b4]Tb4b4b4; Te6edf3k Tff7b72+Tff7b72= Te6edf3hash_sizeTff7b72*Te6edf3hash_countTb4b4b4;
Tffa657uint8_t Te6edf3extra_type Tff7b72= Te6edf3dataTb4b4b4[Te6edf3kTff7b72+Tff7b72+Tb4b4b4] Tff7b72& T79c0ff0x0FTb4b4b4; T8b949e// upper 4 bits reserved for future use
Tffa657uint8_tTff7b72* Te6edf3extra Tff7b72= Tff7b72&Te6edf3dataTb4b4b4[Te6edf3kTb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3extra_len Tff7b72= Te6edf3len Tff7b72- Te6edf3kTb4b4b4; T8b949e// remainder of packet (may be padded with zeroes!)
Tff7b72if Tb4b4b4(Te6edf3onPeerPathRecvTb4b4b4(Te6edf3pktTb4b4b4, Te6edf3jTb4b4b4, Te6edf3secretTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3path_lenTb4b4b4, Te6edf3extra_typeTb4b4b4, Te6edf3extraTb4b4b4, Te6edf3extra_lenTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3isRouteFloodTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e// send a reciprocal return path to sender, but send DIRECTLY!
Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3rpath Tff7b72= Te6edf3createPathReturnTb4b4b4(Tff7b72&Te6edf3src_hashTb4b4b4, Te6edf3secretTb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3pathTb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3path_lenTb4b4b4, T79c0ff0Tb4b4b4, Tffa657NULLTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3rpathTb4b4b4) Te6edf3sendDirectTb4b4b4(Te6edf3rpathTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3path_lenTb4b4b4, T79c0ff500Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3onPeerDataRecvTb4b4b4(Te6edf3pktTb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3jTb4b4b4, Te6edf3secretTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3found Tff7b72= Tffa657trueTb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3foundTb4b4b4) Tb4b4b4{
Te6edf3pktTff7b72-Tff7b72>Te6edf3markDoNotRetransmitTb4b4b4(Tb4b4b4)Tb4b4b4; T8b949e// packet was for this node, so don't retransmit
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s recv matches no peers, src_hash=%02XTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4, Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3src_hashTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3action Tff7b72= Te6edf3routeRecvPacketTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Tff7b72PAYLOAD_TYPE_ANON_REQTb4b4b4: Tb4b4b4{
Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4;
Tffa657uint8_t Te6edf3dest_hash Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTff7b72+Tff7b72+Tb4b4b4]Tb4b4b4;
Tffa657uint8_tTff7b72* Te6edf3sender_pub_key Tff7b72= Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4; Te6edf3i Tff7b72+Tff7b72= Te6edf3PUB_KEY_SIZETb4b4b4;
Tffa657uint8_tTff7b72* Te6edf3macAndData Tff7b72= Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4; T8b949e// MAC + encrypted data
Tff7b72if Tb4b4b4(Te6edf3i Tff7b72+ T79c0ff2 Tff7b72>Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::onRecvPacket(): incomplete data packetTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_tablesTff7b72-Tff7b72>Te6edf3wasSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3self_idTb4b4b4.Te6edf3isHashMatchTb4b4b4(Tff7b72&Te6edf3dest_hashTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3Identity Te6edf3senderTb4b4b4(Te6edf3sender_pub_keyTb4b4b4)Tb4b4b4;
Tffa657uint8_t Te6edf3secretTb4b4b4[Te6edf3PUB_KEY_SIZETb4b4b4]Tb4b4b4;
Te6edf3self_idTb4b4b4.Te6edf3calcSharedSecretTb4b4b4(Te6edf3secretTb4b4b4, Te6edf3senderTb4b4b4)Tb4b4b4;
T8b949e// decrypt, checking MAC is valid
Tffa657uint8_t Te6edf3dataTb4b4b4[Te6edf3MAX_PACKET_PAYLOADTb4b4b4]Tb4b4b4;
Tffa657int Te6edf3len Tff7b72= Te6edf3UtilsTff7b72:Tff7b72:Te6edf3MACThenDecryptTb4b4b4(Te6edf3secretTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3macAndDataTb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_len Tff7b72- Te6edf3iTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3len Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{ T8b949e// success!
Te6edf3onAnonDataRecvTb4b4b4(Te6edf3pktTb4b4b4, Te6edf3secretTb4b4b4, Te6edf3senderTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Te6edf3pktTff7b72-Tff7b72>Te6edf3markDoNotRetransmitTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3action Tff7b72= Te6edf3routeRecvPacketTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Tff7b72PAYLOAD_TYPE_GRP_DATATb4b4b4:
Tff7b72case Tff7b72PAYLOAD_TYPE_GRP_TXTTb4b4b4: Tb4b4b4{
Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4;
Tffa657uint8_t Te6edf3channel_hash Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTff7b72+Tff7b72+Tb4b4b4]Tb4b4b4;
Tffa657uint8_tTff7b72* Te6edf3macAndData Tff7b72= Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4; T8b949e// MAC + encrypted data
Tff7b72if Tb4b4b4(Te6edf3i Tff7b72+ T79c0ff2 Tff7b72>Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::onRecvPacket(): incomplete data packetTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_tablesTff7b72-Tff7b72>Te6edf3wasSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
T8b949e// scan channels DB, for all matching hashes of 'channel_hash' (max 4 matches supported ATM)
Te6edf3GroupChannel Te6edf3channelsTb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4;
Tffa657int Te6edf3num Tff7b72= Te6edf3searchChannelsByHashTb4b4b4(Tff7b72&Te6edf3channel_hashTb4b4b4, Te6edf3channelsTb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4;
T8b949e// for each matching channel, try to decrypt data
Tff7b72for Tb4b4b4(Tffa657int Te6edf3j Tff7b72= T79c0ff0Tb4b4b4; Te6edf3j Tff7b72< Te6edf3numTb4b4b4; Te6edf3jTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
T8b949e// decrypt, checking MAC is valid
Tffa657uint8_t Te6edf3dataTb4b4b4[Te6edf3MAX_PACKET_PAYLOADTb4b4b4]Tb4b4b4;
Tffa657int Te6edf3len Tff7b72= Te6edf3UtilsTff7b72:Tff7b72:Te6edf3MACThenDecryptTb4b4b4(Te6edf3channelsTb4b4b4[Te6edf3jTb4b4b4]Tb4b4b4.Te6edf3secretTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3macAndDataTb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_len Tff7b72- Te6edf3iTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3len Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{ T8b949e// success!
Te6edf3onGroupDataRecvTb4b4b4(Te6edf3pktTb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3channelsTb4b4b4[Te6edf3jTb4b4b4]Tb4b4b4, Te6edf3dataTb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3action Tff7b72= Te6edf3routeRecvPacketTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Tff7b72PAYLOAD_TYPE_ADVERTTb4b4b4: Tb4b4b4{
Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3Identity Te6edf3idTb4b4b4;
Te6edf3memcpyTb4b4b4(Te6edf3idTb4b4b4.Te6edf3pub_keyTb4b4b4, Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4; Te6edf3i Tff7b72+Tff7b72= Te6edf3PUB_KEY_SIZETb4b4b4;
Tffa657uint32_t Te6edf3timestampTb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3timestampTb4b4b4, Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4; Te6edf3i Tff7b72+Tff7b72= T79c0ff4Tb4b4b4;
Tff7b72const Tffa657uint8_tTff7b72* Te6edf3signature Tff7b72= Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4; Te6edf3i Tff7b72+Tff7b72= Te6edf3SIGNATURE_SIZETb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3i Tff7b72> Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::onRecvPacket(): incomplete advertisement packetTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3self_idTb4b4b4.Te6edf3matchesTb4b4b4(Te6edf3idTb4b4b4.Te6edf3pub_keyTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::onRecvPacket(): receiving SELF advert packetTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_tablesTff7b72-Tff7b72>Te6edf3wasSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tffa657uint8_tTff7b72* Te6edf3app_data Tff7b72= Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Tffa657int Te6edf3app_data_len Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_len Tff7b72- Te6edf3iTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3app_data_len Tff7b72> Te6edf3MAX_ADVERT_DATA_SIZETb4b4b4) Tb4b4b4{ Te6edf3app_data_len Tff7b72= Te6edf3MAX_ADVERT_DATA_SIZETb4b4b4; Tb4b4b4}
T8b949e// check that signature is valid
Tffa657bool Te6edf3is_okTb4b4b4;
Tb4b4b4{
Tffa657uint8_t Te6edf3messageTb4b4b4[Te6edf3PUB_KEY_SIZE Tff7b72+ T79c0ff4 Tff7b72+ Te6edf3MAX_ADVERT_DATA_SIZETb4b4b4]Tb4b4b4;
Tffa657int Te6edf3msg_len Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3messageTb4b4b4[Te6edf3msg_lenTb4b4b4]Tb4b4b4, Te6edf3idTb4b4b4.Te6edf3pub_keyTb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4; Te6edf3msg_len Tff7b72+Tff7b72= Te6edf3PUB_KEY_SIZETb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3messageTb4b4b4[Te6edf3msg_lenTb4b4b4]Tb4b4b4, Tff7b72&Te6edf3timestampTb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4; Te6edf3msg_len Tff7b72+Tff7b72= T79c0ff4Tb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3messageTb4b4b4[Te6edf3msg_lenTb4b4b4]Tb4b4b4, Te6edf3app_dataTb4b4b4, Te6edf3app_data_lenTb4b4b4)Tb4b4b4; Te6edf3msg_len Tff7b72+Tff7b72= Te6edf3app_data_lenTb4b4b4;
Te6edf3is_ok Tff7b72= Te6edf3idTb4b4b4.Te6edf3verifyTb4b4b4(Te6edf3signatureTb4b4b4, Te6edf3messageTb4b4b4, Te6edf3msg_lenTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3is_okTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::onRecvPacket(): valid advertisement received!Ta5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3onAdvertRecvTb4b4b4(Te6edf3pktTb4b4b4, Te6edf3idTb4b4b4, Te6edf3timestampTb4b4b4, Te6edf3app_dataTb4b4b4, Te6edf3app_data_lenTb4b4b4)Tb4b4b4;
Te6edf3action Tff7b72= Te6edf3routeRecvPacketTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::onRecvPacket(): received advertisement with forged signature! (app_data_len=%d)Ta5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3app_data_lenTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Tff7b72PAYLOAD_TYPE_RAW_CUSTOMTb4b4b4: Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3isRouteDirectTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Tff7b72!Te6edf3_tablesTff7b72-Tff7b72>Te6edf3wasSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Te6edf3onRawDataRecvTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
T8b949e//action = routeRecvPacket(pkt); don't flood route these (yet)
Tb4b4b4}
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Tff7b72PAYLOAD_TYPE_MULTIPARTTb4b4b4:
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_len Tff7b72> T79c0ff2Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3remaining Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72>Tff7b72> T79c0ff4Tb4b4b4; T8b949e// num of packets in this multipart sequence still to be sent
Tffa657uint8_t Te6edf3type Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72& T79c0ff0x0FTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3type Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_ACK Tff7b72&Tff7b72& Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_len Tff7b72>Tff7b72= T79c0ff5Tb4b4b4) Tb4b4b4{ T8b949e// a multipart ACK
Te6edf3Packet Te6edf3tmpTb4b4b4;
Te6edf3tmpTb4b4b4.Te6edf3header Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3headerTb4b4b4;
Te6edf3tmpTb4b4b4.Te6edf3path_len Tff7b72= Te6edf3PacketTff7b72:Tff7b72:Te6edf3copyPathTb4b4b4(Te6edf3tmpTb4b4b4.Te6edf3pathTb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3pathTb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3path_lenTb4b4b4)Tb4b4b4;
Te6edf3tmpTb4b4b4.Te6edf3payload_len Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_len Tff7b72- T79c0ff1Tb4b4b4;
Te6edf3memcpyTb4b4b4(Te6edf3tmpTb4b4b4.Te6edf3payloadTb4b4b4, Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3tmpTb4b4b4.Te6edf3payload_lenTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_tablesTff7b72-Tff7b72>Te6edf3wasSeenTb4b4b4(Tff7b72&Te6edf3tmpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Tff7b72&Te6edf3tmpTb4b4b4)Tb4b4b4;
Tffa657uint32_t Te6edf3ack_crcTb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3ack_crcTb4b4b4, Te6edf3tmpTb4b4b4.Te6edf3payloadTb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4;
Te6edf3onAckRecvTb4b4b4(Tff7b72&Te6edf3tmpTb4b4b4, Te6edf3ack_crcTb4b4b4)Tb4b4b4;
T8b949e//action = routeRecvPacket(&tmp); // NOTE: currently not needed, as multipart ACKs not sent Flood
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// FUTURE: other multipart types??
Tb4b4b4}
Tb4b4b4}
Tff7b72breakTb4b4b4;
Tff7b72defaultTff7b72:
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::onRecvPacket(): unknown payload type, header: %dTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4, Tb4b4b4(Tffa657intTb4b4b4) Te6edf3pktTff7b72-Tff7b72>Te6edf3headerTb4b4b4)Tb4b4b4;
T8b949e// Don't flood route unknown packet types! action = routeRecvPacket(pkt);
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3actionTb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffMesh::removeSelfFromPathTb4b4b4(Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4) Tb4b4b4{
T8b949e// remove our hash from 'path'
Te6edf3pktTff7b72-Tff7b72>Te6edf3setPathHashCountTb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3getPathHashCountTb4b4b4(Tb4b4b4) Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4; T8b949e// decrement the count
Tffa657uint8_t Te6edf3sz Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3getPathHashSizeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3k Tff7b72= T79c0ff0Tb4b4b4; Te6edf3k Tff7b72< Te6edf3pktTff7b72-Tff7b72>Te6edf3getPathHashCountTb4b4b4(Tb4b4b4)Tff7b72*Te6edf3szTb4b4b4; Te6edf3k Tff7b72+Tff7b72= Te6edf3szTb4b4b4) Tb4b4b4{ T8b949e// shuffle path by 1 'entry'
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3pathTb4b4b4[Te6edf3kTb4b4b4]Tb4b4b4, Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3pathTb4b4b4[Te6edf3k Tff7b72+ Te6edf3szTb4b4b4]Tb4b4b4, Te6edf3szTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3DispatcherAction Td2a8ffMesh::routeRecvPacketTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3n Tff7b72= Te6edf3packetTff7b72-Tff7b72>Te6edf3getPathHashCountTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3isRouteFloodTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Tff7b72!Te6edf3packetTff7b72-Tff7b72>Te6edf3isMarkedDoNotRetransmitTb4b4b4(Tb4b4b4)
Tff7b72&Tff7b72& Tb4b4b4(Te6edf3n Tff7b72+ T79c0ff1Tb4b4b4)Tff7b72*Te6edf3packetTff7b72-Tff7b72>Te6edf3getPathHashSizeTb4b4b4(Tb4b4b4) Tff7b72<Tff7b72= Te6edf3MAX_PATH_SIZE Tff7b72&Tff7b72& Te6edf3allowPacketForwardTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e// append this node's hash to 'path'
Te6edf3self_idTb4b4b4.Te6edf3copyHashToTb4b4b4(Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3pathTb4b4b4[Te6edf3n Tff7b72* Te6edf3packetTff7b72-Tff7b72>Te6edf3getPathHashSizeTb4b4b4(Tb4b4b4)Tb4b4b4]Tb4b4b4, Te6edf3packetTff7b72-Tff7b72>Te6edf3getPathHashSizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3setPathHashCountTb4b4b4(Te6edf3n Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4;
Tffa657uint32_t Te6edf3d Tff7b72= Te6edf3getRetransmitDelayTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4;
T8b949e// as this propagates outwards, give it lower and lower priority
Tff7b72return Te6edf3ACTION_RETRANSMIT_DELAYEDTb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3getPathHashCountTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3dTb4b4b4)Tb4b4b4; T8b949e// give priority to closer sources, than ones further away
Tb4b4b4}
Tff7b72return Te6edf3ACTION_RELEASETb4b4b4;
Tb4b4b4}
Te6edf3DispatcherAction Td2a8ffMesh::forwardMultipartDirectTb4b4b4(Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3remaining Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72>Tff7b72> T79c0ff4Tb4b4b4; T8b949e// num of packets in this multipart sequence still to be sent
Tffa657uint8_t Te6edf3type Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72& T79c0ff0x0FTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3type Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_ACK Tff7b72&Tff7b72& Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_len Tff7b72>Tff7b72= T79c0ff5Tb4b4b4) Tb4b4b4{ T8b949e// a multipart ACK
Te6edf3Packet Te6edf3tmpTb4b4b4;
Te6edf3tmpTb4b4b4.Te6edf3header Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3headerTb4b4b4;
Te6edf3tmpTb4b4b4.Te6edf3path_len Tff7b72= Te6edf3PacketTff7b72:Tff7b72:Te6edf3copyPathTb4b4b4(Te6edf3tmpTb4b4b4.Te6edf3pathTb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3pathTb4b4b4, Te6edf3pktTff7b72-Tff7b72>Te6edf3path_lenTb4b4b4)Tb4b4b4;
Te6edf3tmpTb4b4b4.Te6edf3payload_len Tff7b72= Te6edf3pktTff7b72-Tff7b72>Te6edf3payload_len Tff7b72- T79c0ff1Tb4b4b4;
Te6edf3memcpyTb4b4b4(Te6edf3tmpTb4b4b4.Te6edf3payloadTb4b4b4, Tff7b72&Te6edf3pktTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3tmpTb4b4b4.Te6edf3payload_lenTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_tablesTff7b72-Tff7b72>Te6edf3wasSeenTb4b4b4(Tff7b72&Te6edf3tmpTb4b4b4)Tb4b4b4) Tb4b4b4{ T8b949e// don't retransmit!
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Tff7b72&Te6edf3tmpTb4b4b4)Tb4b4b4;
Te6edf3removeSelfFromPathTb4b4b4(Tff7b72&Te6edf3tmpTb4b4b4)Tb4b4b4;
Te6edf3routeDirectRecvAcksTb4b4b4(Tff7b72&Te6edf3tmpTb4b4b4, Tb4b4b4(Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3remaining Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72* T79c0ff300Tb4b4b4)Tb4b4b4; T8b949e// expect multipart ACKs 300ms apart (x2)
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3ACTION_RELEASETb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffMesh::routeDirectRecvAcksTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657uint32_t Te6edf3delay_millisTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3packetTff7b72-Tff7b72>Te6edf3isMarkedDoNotRetransmitTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3extra Tff7b72= Te6edf3getExtraAckTransmitCountTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3extra Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3delay_millis Tff7b72+Tff7b72= Te6edf3getDirectRetransmitDelayTb4b4b4(Te6edf3packetTb4b4b4) Tff7b72+ T79c0ff300Tb4b4b4;
Tff7b72auto Te6edf3a1 Tff7b72= Te6edf3createMultiAckTb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4, Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4, Te6edf3extraTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3a1Tb4b4b4) Tb4b4b4{
Te6edf3a1Tff7b72-Tff7b72>Te6edf3path_len Tff7b72= Te6edf3PacketTff7b72:Tff7b72:Te6edf3copyPathTb4b4b4(Te6edf3a1Tff7b72-Tff7b72>Te6edf3pathTb4b4b4, Te6edf3packetTff7b72-Tff7b72>Te6edf3pathTb4b4b4, Te6edf3packetTff7b72-Tff7b72>Te6edf3path_lenTb4b4b4)Tb4b4b4;
Te6edf3a1Tff7b72-Tff7b72>Te6edf3header Tff7b72&Tff7b72= Tff7b72~Te6edf3PH_ROUTE_MASKTb4b4b4;
Te6edf3a1Tff7b72-Tff7b72>Te6edf3header Tff7b72|Tff7b72= Te6edf3ROUTE_TYPE_DIRECTTb4b4b4;
Te6edf3sendPacketTb4b4b4(Te6edf3a1Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3delay_millisTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3extraTff7b72-Tff7b72-Tb4b4b4;
Tb4b4b4}
Tff7b72auto Te6edf3a2 Tff7b72= Te6edf3createAckTb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4, Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3a2Tb4b4b4) Tb4b4b4{
Te6edf3a2Tff7b72-Tff7b72>Te6edf3path_len Tff7b72= Te6edf3PacketTff7b72:Tff7b72:Te6edf3copyPathTb4b4b4(Te6edf3a2Tff7b72-Tff7b72>Te6edf3pathTb4b4b4, Te6edf3packetTff7b72-Tff7b72>Te6edf3pathTb4b4b4, Te6edf3packetTff7b72-Tff7b72>Te6edf3path_lenTb4b4b4)Tb4b4b4;
Te6edf3a2Tff7b72-Tff7b72>Te6edf3header Tff7b72&Tff7b72= Tff7b72~Te6edf3PH_ROUTE_MASKTb4b4b4;
Te6edf3a2Tff7b72-Tff7b72>Te6edf3header Tff7b72|Tff7b72= Te6edf3ROUTE_TYPE_DIRECTTb4b4b4;
Te6edf3sendPacketTb4b4b4(Te6edf3a2Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3delay_millisTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3PacketTff7b72* Td2a8ffMesh::createAdvertTb4b4b4(Tff7b72const Te6edf3LocalIdentityTff7b72& Te6edf3idTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3app_dataTb4b4b4, Tffa657size_t Te6edf3app_data_lenTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3app_data_len Tff7b72> Te6edf3MAX_ADVERT_DATA_SIZETb4b4b4) Tff7b72return Tffa657NULLTb4b4b4;
Te6edf3PacketTff7b72* Te6edf3packet Tff7b72= Te6edf3obtainNewPacketTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3packet Tff7b72=Tff7b72= Tffa657NULLTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::createAdvert(): error, packet pool emptyTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657NULLTb4b4b4;
Tb4b4b4}
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72= Tb4b4b4(Te6edf3PAYLOAD_TYPE_ADVERT Tff7b72<Tff7b72< Te6edf3PH_TYPE_SHIFTTb4b4b4)Tb4b4b4; T8b949e// ROUTE_TYPE_* is set later
Tffa657int Te6edf3len Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4, Te6edf3idTb4b4b4.Te6edf3pub_keyTb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4; Te6edf3len Tff7b72+Tff7b72= Te6edf3PUB_KEY_SIZETb4b4b4;
Tffa657uint32_t Te6edf3emitted_timestamp Tff7b72= Te6edf3_rtcTff7b72-Tff7b72>Te6edf3getCurrentTimeTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4, Tff7b72&Te6edf3emitted_timestampTb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4; Te6edf3len Tff7b72+Tff7b72= T79c0ff4Tb4b4b4;
Tffa657uint8_tTff7b72* Te6edf3signature Tff7b72= Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4; Te6edf3len Tff7b72+Tff7b72= Te6edf3SIGNATURE_SIZETb4b4b4; T8b949e// will fill this in later
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4, Te6edf3app_dataTb4b4b4, Te6edf3app_data_lenTb4b4b4)Tb4b4b4; Te6edf3len Tff7b72+Tff7b72= Te6edf3app_data_lenTb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_len Tff7b72= Te6edf3lenTb4b4b4;
Tb4b4b4{
Tffa657uint8_t Te6edf3messageTb4b4b4[Te6edf3PUB_KEY_SIZE Tff7b72+ T79c0ff4 Tff7b72+ Te6edf3MAX_ADVERT_DATA_SIZETb4b4b4]Tb4b4b4;
Tffa657int Te6edf3msg_len Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3messageTb4b4b4[Te6edf3msg_lenTb4b4b4]Tb4b4b4, Te6edf3idTb4b4b4.Te6edf3pub_keyTb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4; Te6edf3msg_len Tff7b72+Tff7b72= Te6edf3PUB_KEY_SIZETb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3messageTb4b4b4[Te6edf3msg_lenTb4b4b4]Tb4b4b4, Tff7b72&Te6edf3emitted_timestampTb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4; Te6edf3msg_len Tff7b72+Tff7b72= T79c0ff4Tb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3messageTb4b4b4[Te6edf3msg_lenTb4b4b4]Tb4b4b4, Te6edf3app_dataTb4b4b4, Te6edf3app_data_lenTb4b4b4)Tb4b4b4; Te6edf3msg_len Tff7b72+Tff7b72= Te6edf3app_data_lenTb4b4b4;
Te6edf3idTb4b4b4.Te6edf3signTb4b4b4(Te6edf3signatureTb4b4b4, Te6edf3messageTb4b4b4, Te6edf3msg_lenTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3packetTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72define MAX_COMBINED_PATH (MAX_PACKET_PAYLOAD - 2 - CIPHER_BLOCK_SIZE)
Te6edf3PacketTff7b72* Td2a8ffMesh::createPathReturnTb4b4b4(Tff7b72const Te6edf3IdentityTff7b72& Te6edf3destTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3secretTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3pathTb4b4b4, Tffa657uint8_t Te6edf3path_lenTb4b4b4, Tffa657uint8_t Te6edf3extra_typeTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72*Te6edf3extraTb4b4b4, Tffa657size_t Te6edf3extra_lenTb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3dest_hashTb4b4b4[Te6edf3PATH_HASH_SIZETb4b4b4]Tb4b4b4;
Te6edf3destTb4b4b4.Te6edf3copyHashToTb4b4b4(Te6edf3dest_hashTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3createPathReturnTb4b4b4(Te6edf3dest_hashTb4b4b4, Te6edf3secretTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3path_lenTb4b4b4, Te6edf3extra_typeTb4b4b4, Te6edf3extraTb4b4b4, Te6edf3extra_lenTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3PacketTff7b72* Td2a8ffMesh::createPathReturnTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3dest_hashTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3secretTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3pathTb4b4b4, Tffa657uint8_t Te6edf3path_lenTb4b4b4, Tffa657uint8_t Te6edf3extra_typeTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72*Te6edf3extraTb4b4b4, Tffa657size_t Te6edf3extra_lenTb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3path_hash_size Tff7b72= Tb4b4b4(Te6edf3path_len Tff7b72>Tff7b72> T79c0ff6Tb4b4b4) Tff7b72+ T79c0ff1Tb4b4b4;
Tffa657uint8_t Te6edf3path_hash_count Tff7b72= Te6edf3path_len Tff7b72& T79c0ff63Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3path_hash_countTff7b72*Te6edf3path_hash_size Tff7b72+ Te6edf3extra_len Tff7b72+ T79c0ff5 Tff7b72> Te6edf3MAX_COMBINED_PATHTb4b4b4) Tff7b72return Tffa657NULLTb4b4b4; T8b949e// too long!!
Te6edf3PacketTff7b72* Te6edf3packet Tff7b72= Te6edf3obtainNewPacketTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3packet Tff7b72=Tff7b72= Tffa657NULLTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::createPathReturn(): error, packet pool emptyTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657NULLTb4b4b4;
Tb4b4b4}
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72= Tb4b4b4(Te6edf3PAYLOAD_TYPE_PATH Tff7b72<Tff7b72< Te6edf3PH_TYPE_SHIFTTb4b4b4)Tb4b4b4; T8b949e// ROUTE_TYPE_* set later
Tffa657int Te6edf3len Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4, Te6edf3dest_hashTb4b4b4, Te6edf3PATH_HASH_SIZETb4b4b4)Tb4b4b4; Te6edf3len Tff7b72+Tff7b72= Te6edf3PATH_HASH_SIZETb4b4b4; T8b949e// dest hash
Te6edf3len Tff7b72+Tff7b72= Te6edf3self_idTb4b4b4.Te6edf3copyHashToTb4b4b4(Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4)Tb4b4b4; T8b949e// src hash
Tb4b4b4{
Tffa657int Te6edf3data_len Tff7b72= T79c0ff0Tb4b4b4;
Tffa657uint8_t Te6edf3dataTb4b4b4[Te6edf3MAX_PACKET_PAYLOADTb4b4b4]Tb4b4b4;
Te6edf3dataTb4b4b4[Te6edf3data_lenTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3path_lenTb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3dataTb4b4b4[Te6edf3data_lenTb4b4b4]Tb4b4b4, Te6edf3pathTb4b4b4, Te6edf3path_hash_countTff7b72*Te6edf3path_hash_sizeTb4b4b4)Tb4b4b4; Te6edf3data_len Tff7b72+Tff7b72= Te6edf3path_hash_countTff7b72*Te6edf3path_hash_sizeTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3extra_len Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3dataTb4b4b4[Te6edf3data_lenTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3extra_typeTb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3dataTb4b4b4[Te6edf3data_lenTb4b4b4]Tb4b4b4, Te6edf3extraTb4b4b4, Te6edf3extra_lenTb4b4b4)Tb4b4b4; Te6edf3data_len Tff7b72+Tff7b72= Te6edf3extra_lenTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// append a timestamp, or random blob (to make packet_hash unique)
Te6edf3dataTb4b4b4[Te6edf3data_lenTff7b72+Tff7b72+Tb4b4b4] Tff7b72= T79c0ff0xFFTb4b4b4; T8b949e// dummy payload type
Te6edf3getRNGTb4b4b4(Tb4b4b4)Tff7b72-Tff7b72>Te6edf3randomTb4b4b4(Tff7b72&Te6edf3dataTb4b4b4[Te6edf3data_lenTb4b4b4]Tb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4; Te6edf3data_len Tff7b72+Tff7b72= T79c0ff4Tb4b4b4;
Tb4b4b4}
Te6edf3len Tff7b72+Tff7b72= Te6edf3UtilsTff7b72:Tff7b72:Te6edf3encryptThenMACTb4b4b4(Te6edf3secretTb4b4b4, Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4, Te6edf3dataTb4b4b4, Te6edf3data_lenTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_len Tff7b72= Te6edf3lenTb4b4b4;
Tff7b72return Te6edf3packetTb4b4b4;
Tb4b4b4}
Te6edf3PacketTff7b72* Td2a8ffMesh::createDatagramTb4b4b4(Tffa657uint8_t Te6edf3typeTb4b4b4, Tff7b72const Te6edf3IdentityTff7b72& Te6edf3destTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3secretTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3dataTb4b4b4, Tffa657size_t Te6edf3data_lenTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3type Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_TXT_MSG Tff7b72|Tff7b72| Te6edf3type Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_REQ Tff7b72|Tff7b72| Te6edf3type Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_RESPONSETb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3data_len Tff7b72+ Te6edf3CIPHER_MAC_SIZE Tff7b72+ Te6edf3CIPHER_BLOCK_SIZET79c0ff-1 Tff7b72> Te6edf3MAX_PACKET_PAYLOADTb4b4b4) Tff7b72return Tffa657NULLTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72return Tffa657NULLTb4b4b4; T8b949e// invalid type
Tb4b4b4}
Te6edf3PacketTff7b72* Te6edf3packet Tff7b72= Te6edf3obtainNewPacketTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3packet Tff7b72=Tff7b72= Tffa657NULLTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::createDatagram(): error, packet pool emptyTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657NULLTb4b4b4;
Tb4b4b4}
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72= Tb4b4b4(Te6edf3type Tff7b72<Tff7b72< Te6edf3PH_TYPE_SHIFTTb4b4b4)Tb4b4b4; T8b949e// ROUTE_TYPE_* set later
Tffa657int Te6edf3len Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3len Tff7b72+Tff7b72= Te6edf3destTb4b4b4.Te6edf3copyHashToTb4b4b4(Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4)Tb4b4b4; T8b949e// dest hash
Te6edf3len Tff7b72+Tff7b72= Te6edf3self_idTb4b4b4.Te6edf3copyHashToTb4b4b4(Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4)Tb4b4b4; T8b949e// src hash
Te6edf3len Tff7b72+Tff7b72= Te6edf3UtilsTff7b72:Tff7b72:Te6edf3encryptThenMACTb4b4b4(Te6edf3secretTb4b4b4, Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4, Te6edf3dataTb4b4b4, Te6edf3data_lenTb4b4b4)Tb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_len Tff7b72= Te6edf3lenTb4b4b4;
Tff7b72return Te6edf3packetTb4b4b4;
Tb4b4b4}
Te6edf3PacketTff7b72* Td2a8ffMesh::createAnonDatagramTb4b4b4(Tffa657uint8_t Te6edf3typeTb4b4b4, Tff7b72const Te6edf3LocalIdentityTff7b72& Te6edf3senderTb4b4b4, Tff7b72const Te6edf3IdentityTff7b72& Te6edf3destTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3secretTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3dataTb4b4b4, Tffa657size_t Te6edf3data_lenTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3type Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_ANON_REQTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3data_len Tff7b72+ T79c0ff1 Tff7b72+ Te6edf3PUB_KEY_SIZE Tff7b72+ Te6edf3CIPHER_BLOCK_SIZET79c0ff-1 Tff7b72> Te6edf3MAX_PACKET_PAYLOADTb4b4b4) Tff7b72return Tffa657NULLTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72return Tffa657NULLTb4b4b4; T8b949e// invalid type
Tb4b4b4}
Te6edf3PacketTff7b72* Te6edf3packet Tff7b72= Te6edf3obtainNewPacketTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3packet Tff7b72=Tff7b72= Tffa657NULLTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::createAnonDatagram(): error, packet pool emptyTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657NULLTb4b4b4;
Tb4b4b4}
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72= Tb4b4b4(Te6edf3type Tff7b72<Tff7b72< Te6edf3PH_TYPE_SHIFTTb4b4b4)Tb4b4b4; T8b949e// ROUTE_TYPE_* set later
Tffa657int Te6edf3len Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3type Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_ANON_REQTb4b4b4) Tb4b4b4{
Te6edf3len Tff7b72+Tff7b72= Te6edf3destTb4b4b4.Te6edf3copyHashToTb4b4b4(Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4)Tb4b4b4; T8b949e// dest hash
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4, Te6edf3senderTb4b4b4.Te6edf3pub_keyTb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4; Te6edf3len Tff7b72+Tff7b72= Te6edf3PUB_KEY_SIZETb4b4b4; T8b949e// sender pub_key
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// FUTURE:
Tb4b4b4}
Te6edf3len Tff7b72+Tff7b72= Te6edf3UtilsTff7b72:Tff7b72:Te6edf3encryptThenMACTb4b4b4(Te6edf3secretTb4b4b4, Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4, Te6edf3dataTb4b4b4, Te6edf3data_lenTb4b4b4)Tb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_len Tff7b72= Te6edf3lenTb4b4b4;
Tff7b72return Te6edf3packetTb4b4b4;
Tb4b4b4}
Te6edf3PacketTff7b72* Td2a8ffMesh::createGroupDatagramTb4b4b4(Tffa657uint8_t Te6edf3typeTb4b4b4, Tff7b72const Te6edf3GroupChannelTff7b72& Te6edf3channelTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3dataTb4b4b4, Tffa657size_t Te6edf3data_lenTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tb4b4b4(Te6edf3type Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_GRP_TXT Tff7b72|Tff7b72| Te6edf3type Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_GRP_DATATb4b4b4)Tb4b4b4) Tff7b72return Tffa657NULLTb4b4b4; T8b949e// invalid type
Tff7b72if Tb4b4b4(Te6edf3data_len Tff7b72+ T79c0ff1 Tff7b72+ Te6edf3CIPHER_BLOCK_SIZET79c0ff-1 Tff7b72> Te6edf3MAX_PACKET_PAYLOADTb4b4b4) Tff7b72return Tffa657NULLTb4b4b4; T8b949e// too long
Te6edf3PacketTff7b72* Te6edf3packet Tff7b72= Te6edf3obtainNewPacketTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3packet Tff7b72=Tff7b72= Tffa657NULLTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::createGroupDatagram(): error, packet pool emptyTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657NULLTb4b4b4;
Tb4b4b4}
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72= Tb4b4b4(Te6edf3type Tff7b72<Tff7b72< Te6edf3PH_TYPE_SHIFTTb4b4b4)Tb4b4b4; T8b949e// ROUTE_TYPE_* set later
Tffa657int Te6edf3len Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4, Te6edf3channelTb4b4b4.Te6edf3hashTb4b4b4, Te6edf3PATH_HASH_SIZETb4b4b4)Tb4b4b4; Te6edf3len Tff7b72+Tff7b72= Te6edf3PATH_HASH_SIZETb4b4b4;
Te6edf3len Tff7b72+Tff7b72= Te6edf3UtilsTff7b72:Tff7b72:Te6edf3encryptThenMACTb4b4b4(Te6edf3channelTb4b4b4.Te6edf3secretTb4b4b4, Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3lenTb4b4b4]Tb4b4b4, Te6edf3dataTb4b4b4, Te6edf3data_lenTb4b4b4)Tb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_len Tff7b72= Te6edf3lenTb4b4b4;
Tff7b72return Te6edf3packetTb4b4b4;
Tb4b4b4}
Te6edf3PacketTff7b72* Td2a8ffMesh::createAckTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3ackTb4b4b4, Tffa657uint8_t Te6edf3lenTb4b4b4) Tb4b4b4{
Te6edf3PacketTff7b72* Te6edf3packet Tff7b72= Te6edf3obtainNewPacketTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3packet Tff7b72=Tff7b72= Tffa657NULLTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::createAck(): error, packet pool emptyTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657NULLTb4b4b4;
Tb4b4b4}
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72= Tb4b4b4(Te6edf3PAYLOAD_TYPE_ACK Tff7b72<Tff7b72< Te6edf3PH_TYPE_SHIFTTb4b4b4)Tb4b4b4; T8b949e// ROUTE_TYPE_* set later
Te6edf3memcpyTb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4, Te6edf3ackTb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_len Tff7b72= Te6edf3lenTb4b4b4;
Tff7b72return Te6edf3packetTb4b4b4;
Tb4b4b4}
Te6edf3PacketTff7b72* Td2a8ffMesh::createMultiAckTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3ackTb4b4b4, Tffa657uint8_t Te6edf3lenTb4b4b4, Tffa657uint8_t Te6edf3remainingTb4b4b4) Tb4b4b4{
Te6edf3PacketTff7b72* Te6edf3packet Tff7b72= Te6edf3obtainNewPacketTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3packet Tff7b72=Tff7b72= Tffa657NULLTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::createMultiAck(): error, packet pool emptyTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657NULLTb4b4b4;
Tb4b4b4}
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72= Tb4b4b4(Te6edf3PAYLOAD_TYPE_MULTIPART Tff7b72<Tff7b72< Te6edf3PH_TYPE_SHIFTTb4b4b4)Tb4b4b4; T8b949e// ROUTE_TYPE_* set later
Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3remaining Tff7b72<Tff7b72< T79c0ff4Tb4b4b4) Tff7b72| Te6edf3PAYLOAD_TYPE_ACKTb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3ackTb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_len Tff7b72= T79c0ff1 Tff7b72+ Te6edf3lenTb4b4b4;
Tff7b72return Te6edf3packetTb4b4b4;
Tb4b4b4}
Te6edf3PacketTff7b72* Td2a8ffMesh::createRawDataTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3dataTb4b4b4, Tffa657size_t Te6edf3lenTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3len Tff7b72> Tff7b72sizeofTb4b4b4(Te6edf3PacketTff7b72:Tff7b72:Te6edf3payloadTb4b4b4)Tb4b4b4) Tff7b72return Tffa657NULLTb4b4b4; T8b949e// invalid arg
Te6edf3PacketTff7b72* Te6edf3packet Tff7b72= Te6edf3obtainNewPacketTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3packet Tff7b72=Tff7b72= Tffa657NULLTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::createRawData(): error, packet pool emptyTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657NULLTb4b4b4;
Tb4b4b4}
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72= Tb4b4b4(Te6edf3PAYLOAD_TYPE_RAW_CUSTOM Tff7b72<Tff7b72< Te6edf3PH_TYPE_SHIFTTb4b4b4)Tb4b4b4; T8b949e// ROUTE_TYPE_* set later
Te6edf3memcpyTb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_len Tff7b72= Te6edf3lenTb4b4b4;
Tff7b72return Te6edf3packetTb4b4b4;
Tb4b4b4}
Te6edf3PacketTff7b72* Td2a8ffMesh::createTraceTb4b4b4(Tffa657uint32_t Te6edf3tagTb4b4b4, Tffa657uint32_t Te6edf3auth_codeTb4b4b4, Tffa657uint8_t Te6edf3flagsTb4b4b4) Tb4b4b4{
Te6edf3PacketTff7b72* Te6edf3packet Tff7b72= Te6edf3obtainNewPacketTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3packet Tff7b72=Tff7b72= Tffa657NULLTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::createTrace(): error, packet pool emptyTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657NULLTb4b4b4;
Tb4b4b4}
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72= Tb4b4b4(Te6edf3PAYLOAD_TYPE_TRACE Tff7b72<Tff7b72< Te6edf3PH_TYPE_SHIFTTb4b4b4)Tb4b4b4; T8b949e// ROUTE_TYPE_* set later
Te6edf3memcpyTb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4, Tff7b72&Te6edf3tagTb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4;
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4, Tff7b72&Te6edf3auth_codeTb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[T79c0ff8Tb4b4b4] Tff7b72= Te6edf3flagsTb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_len Tff7b72= T79c0ff9Tb4b4b4; T8b949e// NOTE: path will be appended to payload[] later
Tff7b72return Te6edf3packetTb4b4b4;
Tb4b4b4}
Te6edf3PacketTff7b72* Td2a8ffMesh::createControlDataTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3dataTb4b4b4, Tffa657size_t Te6edf3lenTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3len Tff7b72> Tff7b72sizeofTb4b4b4(Te6edf3PacketTff7b72:Tff7b72:Te6edf3payloadTb4b4b4)Tb4b4b4) Tff7b72return Tffa657NULLTb4b4b4; T8b949e// invalid arg
Te6edf3PacketTff7b72* Te6edf3packet Tff7b72= Te6edf3obtainNewPacketTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3packet Tff7b72=Tff7b72= Tffa657NULLTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::createControlData(): error, packet pool emptyTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657NULLTb4b4b4;
Tb4b4b4}
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72= Tb4b4b4(Te6edf3PAYLOAD_TYPE_CONTROL Tff7b72<Tff7b72< Te6edf3PH_TYPE_SHIFTTb4b4b4)Tb4b4b4; T8b949e// ROUTE_TYPE_* set later
Te6edf3memcpyTb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_len Tff7b72= Te6edf3lenTb4b4b4;
Tff7b72return Te6edf3packetTb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffMesh::sendFloodTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657uint32_t Te6edf3delay_millisTb4b4b4, Tffa657uint8_t Te6edf3path_hash_sizeTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_TRACETb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::sendFlood(): TRACE type not suspportedTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3path_hash_size Tff7b72=Tff7b72= T79c0ff0 Tff7b72|Tff7b72| Te6edf3path_hash_size Tff7b72> T79c0ff3Tb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::sendFlood(): invalid path_hash_sizeTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72&Tff7b72= Tff7b72~Te6edf3PH_ROUTE_MASKTb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72|Tff7b72= Te6edf3ROUTE_TYPE_FLOODTb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3setPathHashSizeAndCountTb4b4b4(Te6edf3path_hash_sizeTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4; T8b949e// mark this packet as already sent in case it is rebroadcast back to us
Tffa657uint8_t Te6edf3priTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_PATHTb4b4b4) Tb4b4b4{
Te6edf3pri Tff7b72= T79c0ff2Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_ADVERTTb4b4b4) Tb4b4b4{
Te6edf3pri Tff7b72= T79c0ff3Tb4b4b4; T8b949e// de-prioritie these
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3pri Tff7b72= T79c0ff1Tb4b4b4;
Tb4b4b4}
Te6edf3sendPacketTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3priTb4b4b4, Te6edf3delay_millisTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffMesh::sendFloodTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657uint16_tTff7b72* Te6edf3transport_codesTb4b4b4, Tffa657uint32_t Te6edf3delay_millisTb4b4b4, Tffa657uint8_t Te6edf3path_hash_sizeTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_TRACETb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::sendFlood(): TRACE type not suspportedTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3path_hash_size Tff7b72=Tff7b72= T79c0ff0 Tff7b72|Tff7b72| Te6edf3path_hash_size Tff7b72> T79c0ff3Tb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s Mesh::sendFlood(): invalid path_hash_sizeTa5d6ff"Tb4b4b4, Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72&Tff7b72= Tff7b72~Te6edf3PH_ROUTE_MASKTb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72|Tff7b72= Te6edf3ROUTE_TYPE_TRANSPORT_FLOODTb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3transport_codesTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Te6edf3transport_codesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3transport_codesTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Te6edf3transport_codesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3setPathHashSizeAndCountTb4b4b4(Te6edf3path_hash_sizeTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4; T8b949e// mark this packet as already sent in case it is rebroadcast back to us
Tffa657uint8_t Te6edf3priTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_PATHTb4b4b4) Tb4b4b4{
Te6edf3pri Tff7b72= T79c0ff2Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_ADVERTTb4b4b4) Tb4b4b4{
Te6edf3pri Tff7b72= T79c0ff3Tb4b4b4; T8b949e// de-prioritie these
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3pri Tff7b72= T79c0ff1Tb4b4b4;
Tb4b4b4}
Te6edf3sendPacketTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3priTb4b4b4, Te6edf3delay_millisTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffMesh::sendDirectTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3pathTb4b4b4, Tffa657uint8_t Te6edf3path_lenTb4b4b4, Tffa657uint32_t Te6edf3delay_millisTb4b4b4) Tb4b4b4{
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72&Tff7b72= Tff7b72~Te6edf3PH_ROUTE_MASKTb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72|Tff7b72= Te6edf3ROUTE_TYPE_DIRECTTb4b4b4;
Tffa657uint8_t Te6edf3priTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_TRACETb4b4b4) Tb4b4b4{ T8b949e// TRACE packets are different
T8b949e// for TRACE packets, path is appended to end of PAYLOAD. (path is used for SNR's)
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3packetTff7b72-Tff7b72>Te6edf3payloadTb4b4b4[Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_lenTb4b4b4]Tb4b4b4, Te6edf3pathTb4b4b4, Te6edf3path_lenTb4b4b4)Tb4b4b4; T8b949e// NOTE: path_len here can be > 64, and NOT in the new scheme
Te6edf3packetTff7b72-Tff7b72>Te6edf3payload_len Tff7b72+Tff7b72= Te6edf3path_lenTb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3path_len Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3pri Tff7b72= T79c0ff5Tb4b4b4; T8b949e// maybe make this configurable
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3packetTff7b72-Tff7b72>Te6edf3path_len Tff7b72= Te6edf3PacketTff7b72:Tff7b72:Te6edf3copyPathTb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3pathTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3path_lenTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3packetTff7b72-Tff7b72>Te6edf3getPayloadTypeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3PAYLOAD_TYPE_PATHTb4b4b4) Tb4b4b4{
Te6edf3pri Tff7b72= T79c0ff1Tb4b4b4; T8b949e// slightly less priority
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3pri Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4; T8b949e// mark this packet as already sent in case it is rebroadcast back to us
Te6edf3sendPacketTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3priTb4b4b4, Te6edf3delay_millisTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffMesh::sendZeroHopTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657uint32_t Te6edf3delay_millisTb4b4b4) Tb4b4b4{
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72&Tff7b72= Tff7b72~Te6edf3PH_ROUTE_MASKTb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72|Tff7b72= Te6edf3ROUTE_TYPE_DIRECTTb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3path_len Tff7b72= T79c0ff0Tb4b4b4; T8b949e// path_len of zero means Zero Hop
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4; T8b949e// mark this packet as already sent in case it is rebroadcast back to us
Te6edf3sendPacketTb4b4b4(Te6edf3packetTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3delay_millisTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffMesh::sendZeroHopTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657uint16_tTff7b72* Te6edf3transport_codesTb4b4b4, Tffa657uint32_t Te6edf3delay_millisTb4b4b4) Tb4b4b4{
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72&Tff7b72= Tff7b72~Te6edf3PH_ROUTE_MASKTb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3header Tff7b72|Tff7b72= Te6edf3ROUTE_TYPE_TRANSPORT_DIRECTTb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3transport_codesTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Te6edf3transport_codesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3transport_codesTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Te6edf3transport_codesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4;
Te6edf3packetTff7b72-Tff7b72>Te6edf3path_len Tff7b72= T79c0ff0Tb4b4b4; T8b949e// path_len of zero means Zero Hop
Te6edf3_tablesTff7b72-Tff7b72>Te6edf3markSeenTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4; T8b949e// mark this packet as already sent in case it is rebroadcast back to us
Te6edf3sendPacketTb4b4b4(Te6edf3packetTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3delay_millisTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.29s